import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;

public class GestionEnv {

	
	private static HashMap<String,Object> envGlobale = new HashMap<String,Object>();
	
	public HashMap<String,Integer> argFctPredefinie = new HashMap<String,Integer>();
	
	public HashMap<String,Method> methodFctPredefinie = new HashMap<String,Method>();
	
	
	public GestionEnv() {
		argFctPredefinie.put("donnelocale", 2);
		argFctPredefinie.put("donne", 2);
		argFctPredefinie.put("chose", 1);
		
		Class c = GestionEnv.class;
		Method[] tab = c.getMethods();
		
		Method  m;
		for (int i=0;i<tab.length;i++) {
			m = tab[i];
	
			if(m.getName().equals("donnelocale"))
				methodFctPredefinie.put("donnelocale", m);
			
			if(m.getName().equals("donne"))
				methodFctPredefinie.put("donne", m);
			
			if(m.getName().equals("chose"))
				methodFctPredefinie.put("chose", m);
		}    
	};
	
	
	public static Object donnelocale(ArrayList<Object> v,  HashMap<String, Object> penv) throws ParseException, Exception{
		
		if((v.get(0) instanceof String) && v.size()==2) {
			if(chercherEtRemplaceValeur((String)v.get(0),v.get(1),penv) == false) {
				penv.put((String)v.get(0),v.get(1));
				return true;
			}
			else return false;
		}
		else return false;
	}
	
	public static boolean chercherEtRemplaceValeur(String cle, Object val,  HashMap<String, Object> penv) throws ParseException, Exception{
		
	
			if(penv.containsKey(cle)) {
				penv.put(cle,val);
				return true;
			}
			else
				if(penv.containsKey("env_sup")) {
				return chercherEtRemplaceValeur(cle,val,(HashMap)penv.get("env_sup"));
				}
				else
					return false;
	}
	
	
	public static Object donne(ArrayList<Object> v,  HashMap<String, Object> penv) throws ParseException, Exception{
		
		if((v.get(0) instanceof String) && v.size()==2) {
			envGlobale.put((String)v.get(0),v.get(1));
			return true;
		}
		else return false;
	}
	
	public static Object chose(ArrayList<Object> v,  HashMap<String, Object> penv) throws ParseException, Exception{
		
		if((v.get(0) instanceof String) && v.size()==1) 
			if (envGlobale.containsKey((String)v.get(0)))
				return envGlobale.get((String)v.get(0));
			else
				if (penv.containsKey((String)v.get(0)))
					return penv.get((String)v.get(0));
				else
					if(penv.containsKey("env_sup"))
						return chose(v,(HashMap)penv.get("env_sup"));
					else 
						throw new Error("la variable "+(String)v.get(0)+" n'est dans l'env");
		else
			throw new Error("la variable "+(String)v.get(0)+" n'est dans l'env");
		}
	
	
}
